package ij.hkust.QuickPALM;

import ij.plugin.PlugIn;

//
//import ij.*;
//import ij.IJ.*;
//import ij.measure.*;
//import ij.plugin.*;
//import ij.plugin.filter.*;
//import ij.plugin.frame.*;
//import ij.process.*;
//import ij.gui.*;
//import ij.measure.CurveFitter.*;
//import java.awt.*;
//import java.lang.*;
//import java.lang.Math;
//
//import java.util.Random;
//
///**
// * 
// * @author linshan
// *
// */
public class runTest implements PlugIn
{
//	ImagePlus imp; // ij/
//	ImageProcessor ip; // ij/process/
//
//	ImagePlus imp1;
//	ImagePlus imp2;
//	ImageProcessor ip1;
//	ImageProcessor ip2;
//
//	ImageStack res;
//
//	MyDialogs dg = new MyDialogs();
//	MyFunctions f = new MyFunctions();
//	MyIO io = new MyIO();
//
//	RoiManager rmanager;
//
//	Random rd = new Random();
//
//	double [][] board;
//
	public void run(String arg)
	{}}
//		IJ.register(runTest.class); // static method of ij/IJ
//		// *if (!dg.analyseParticles(f)) return;
//		if (!(dg.loadAnalyseParticles() && dg.testConfig()))
//		{
//			IJ.showMessage("Load failed");
//			return;
//		}
//
//		int owidth;
//		int oheight;
//		int width;
//		int height;
//
//		owidth = dg.sim_clwidth;
//		oheight = dg.sim_clheight;
//
//		width = owidth * (int)(dg.sim_campsize*1000/(dg.sim_minpsize*dg.sim_magn));
//		height = oheight * (int)(dg.sim_campsize*1000/(dg.sim_minpsize*dg.sim_magn));
//
//
//		board = new double[owidth][oheight];
//
//		for (int i = 0; i < owidth; i++)
//		{
//			for (int j = 0; j < oheight; j++)
//			{
//				board[i][j] = 0;
//			}
//		}
//
//		double magn = dg.sim_campsize * 1000 / (dg.sim_minpsize * dg.sim_magn);
//
//		f.ptable.reset(); // erase particle table
//
//		if (dg.is3d)
//		{
//			dg.getCalibrationFile();
//			io.loadTransformation(dg.calfile, f.caltable);
//			f.initialize3d();
//		}
//
//		ReconstructionViewer viewer = new ReconstructionViewer(" Reconstruction", owidth, oheight, dg, f);
//		ViewerUpdateTest vUpdate;
//		ViewerUpdateShortTest vUpdateShort;
//
//		ProcessFrameTest [] threads = new ProcessFrameTest[dg.threads];
//		int freeThread=-1;
//
//		long time_start = java.lang.System.currentTimeMillis();
//		long time_took = 0;
//		long time_now=0;
//		long nparticles=0;
//
//		int s=0;
//		boolean ok = true;
//		dg.run = true;
//		boolean on;
//		if (dg.drawer_nframe <= 0)
//			on = true;
//		else
//			on = false;
//
//		res = new ImageStack(owidth, oheight);
//
//		StopTest stopper = new StopTest();
//		stopper.mysetup(dg);
//		stopper.start();
//
//
//		for (int index = 0; dg.run && ok && (index < dg.drawer_nframe || on); index++)
//		{
//			ip = new ShortProcessor(owidth, oheight);
//			for (int i = 0; i < owidth; i++)
//			{
//				for (int j = 0; j < oheight; j++)
//				{
//					board[i][j] = 0;
//				}
//			}
//
//			SetNoise(owidth, oheight);
//
//			if (dg.sim_obj == dg.sim_objs[0])
//			{
//				if (true)
//				{
//					SetSpot((int)(width/2), (int)(height/2), width, height, owidth, oheight, 1);
//				}
//			}
//
//			else
//			{
//				if (rd.nextDouble() < dg.sim_prob)
//					SetSpot((int)(width/2), (int)(height/2), width, height, owidth, oheight, 1);
//				if (rd.nextDouble() < dg.sim_prob)
//					SetSpot((int)(width/2) + (int)(dg.sim_dis/dg.sim_minpsize), (int)(height/2), width, height, owidth, oheight, 1);
//			}
//
//			Draw(ip, owidth, oheight);
//		
//		  ip2 = ip.duplicate();
//
//			res.addSlice("" + index, ip2, 0);
//
//			if (ok)
//			{
//				if (s<threads.length)
//					freeThread=s;
//				else
//				{
//					freeThread=-1;
//					while (freeThread==-1)
//					{
//						for (int t=0;t<threads.length;t++)
//						{
//							if (!threads[t].isAlive())
//							{
//								freeThread=t;
//								break;
//							}
//						}
//						if (freeThread==-1)
//						{
//							try
//							{
//								Thread.currentThread().sleep(1);
//							}
//							catch(Exception e)
//							{
//								IJ.error(""+e);
//							}
//						}
//					}
//				}
//
//				threads[freeThread] = new ProcessFrameTest();
//				threads[freeThread].mysetup(ip, f, dg, s);
//				threads[freeThread].start();
//
//				time_now = java.lang.System.currentTimeMillis();
//				time_took += time_now-time_start;
//				time_start = time_now;
//				if ((s>0) && (s%dg.viewer_update==0))
//				{
//					ij.IJ.showStatus("Processing at "+time_took/dg.viewer_update+" ms/frame "+(f.ptable.getCounter()-nparticles)/dg.viewer_update+" part/frame, detected "+nparticles+" particles");
//					nparticles=f.ptable.getCounter();
//					time_took=0;
//					if (dg.viewer_accumulate==0)
//					{
//						vUpdate = new ViewerUpdateTest();
//						vUpdate.mysetup(viewer);
//						vUpdate.start();
//					}
//					else
//					{
//						vUpdateShort = new ViewerUpdateShortTest();
//						vUpdateShort.mysetup(viewer, Math.round(s+1-dg.viewer_accumulate/2), Math.round(s+1+dg.viewer_accumulate/2));
//						vUpdateShort.start();
//					}
//				}
//			}
//			s++;
//		}
//
//		// End of the while loop
//
//		for (int t=0; t<threads.length;t++)
//		{
//			if(threads[t] != null)
//			{
//				try
//				{
//					threads[t].join();
//				}
//				catch(Exception e)
//				{
//					IJ.error(""+e);
//				}
//			}
//		}
//		if (f.psave!=null) f.psave.close();
//
//		if (dg.viewer_accumulate==0)
//			viewer.update();
//		else
//			viewer.updateShort(Math.round(s-dg.viewer_accumulate/2), s);
//		if (f.ptable.getCounter()<5000000)
//		{
//			IJ.showStatus("Creating particle table, this should take a few seconds...");
//			f.ptable.show("Results");
//		}
//		else
//			IJ.showMessage("Warning", "Results table has too many particles, they will not be shown but the data still exists within it\nyou can still use all the plugin functionality or save table changes though the 'Save Particle Table' command.");
//
//		imp = new ImagePlus("Sample file", res);
//		imp.show();
//
//	}
//
//	void SetNoise(int owidth, int oheight)
//	{
//		for (int i = 0; i < owidth; i++)
//		{
//			for (int j = 0; j < oheight; j++)
//			{
//				board[i][j] += (2 * 25 * rd.nextDouble());
//			}
//		}
//	}
//
//	/*void SetSpot(int x, int y, int width, int height, int owidth, int oheight, double fact)
//	{
//		int peak = 1000;
//
//
//		int xstart;
//		int ystart;
//		int xend;
//		int yend;
//
//		double magn = dg.drawer_psize * 1000 / (dg.drawer_minpsize * dg.drawer_magn);
//
//		double radius = 0.61 * 656.5 * dg.drawer_magn * magn / (dg.drawer_NA * dg.drawer_psize * 1000);
//
//
//		xstart = x - (int)(1.5*radius);
//		ystart = y - (int)(1.5*radius);
//		xend = x + (int)(1.5*radius);
//		yend = y + (int)(1.5*radius);
//
//		for (int i = xstart; i <= xend; i++)
//		{
//			for (int j = ystart; j <= yend; j++)
//			{
//				double r = Math.hypot(i - x, j - y);
//				double add = peak*Math.exp(-2*r*r/(radius*radius));
//				double [] coo = trans(i, j, width, height, owidth, oheight, magn);
//				IJ.log(coo
//				if (coo[0] >= 0 && coo[0] < owidth && coo[1] >= 0 && coo[1] < oheight)
//				{
//					board[(int)(coo[0])][(int)(coo[1])] += add/(magn*magn);
//				}
//			}
//		}
//	}*/
//
//	void SetSpot(int x, int y, int width, int height, int owidth, int oheight, double fact)
//	{
//		double peak;
//
//		int xstart;
//		int ystart;
//		int xend;
//		int yend;
//
//		double magn = dg.sim_campsize * 1000 / (dg.sim_minpsize * dg.sim_magn);
//
//		double radius = dg.drawer_radius;
//
//
//		peak = 1000;
//
//		double [] coo = trans(x, y, width, height, owidth, oheight, magn);
//
//		xstart = ((int)(coo[0]) - (int)(1.5*radius) > 0)?((int)(coo[0]) - (int)(1.5*radius)):0;
//		ystart = ((int)(coo[1]) - (int)(1.5*radius) > 0)?((int)(coo[1]) - (int)(1.5*radius)):0;
//		xend = ((int)(coo[0]) + (int)(1.5*radius) < owidth)?((int)(coo[0]) + (int)(1.5*radius)):owidth - 1;
//		yend = ((int)(coo[1]) + (int)(1.5*radius) < oheight)?((int)(coo[1]) + (int)(1.5*radius)):oheight - 1;
//
//		if (xstart >= owidth || xend < 0 || ystart >= oheight || yend < 0)
//			return;
//
//		for (int i = xstart; i <= xend; i++)
//		{
//			for (int j = ystart; j <= yend; j++)
//			{
//				double r = Math.hypot(i - coo[0], j - coo[1]);
//				double add = peak*Math.exp(-2*r*r/(radius*radius));
//				board[i][j] += add;
//			}
//		}
//	}
//
//
//	double [] trans (int x, int y, int width, int height, int owidth, int oheight, double magn)
//	{
//		double [] npos = new double [2];
//
//		double xshift = owidth/2 - width/(2*magn);
//		double yshift = oheight/2 - height/(2*magn);
//
//		npos[0] = x/magn + xshift;
//		npos[1] = y/magn + yshift;
//
//		return npos;
//	}
//
//
//	void Draw(ImageProcessor ip, int owidth, int oheight)
//	{
//		if (ip == null)
//			ip = new ShortProcessor(owidth, oheight);
//
//		for (int i = 0; i < owidth; i++)
//		{
//			for (int j = 0; j < oheight; j++)
//			{
//				ip.set(i, j, (int)board[i][j]);
//			}
//		}
//	}
//
//}
//
//class StopTest extends Thread
//{
//	private MyDialogs dg;
//	GenericDialog running;
//
//	public void mysetup(MyDialogs dg)
//	{
//		this.dg = dg;
//	}
//
//	public void run()
//	{
//		running = new GenericDialog("");
//		running.hideCancelButton();
//		// running.addMessage("Cancel to stop simulation");
//		running.setOKLabel("Stop");
//		running.showDialog();
//		if (running.wasOKed())
//			this.dg.run = false;
//	}
//}
//
//
//
//
//class ProcessFrameTest extends Thread
//{
//	private ImageProcessor ip;
//	private MyDialogs dg;
//	private int frame;
//	private MyFunctions f;
//
//	public void mysetup(ImageProcessor ip, MyFunctions f, MyDialogs dg, int frame)
//	{
//		this.f=f;
//		this.ip=ip;
//		this.dg=dg;
//		this.frame=frame;
//	}
//
//	public void run()
//	{
//		this.f.detectParticles(this.ip, this.dg, this.frame);
//	}
//}
//
///** Threaded call to the viewer.update method - used to refresh the reconstruction
// * viewer to show the newly detected particles.
// */
//class ViewerUpdateTest extends Thread
//{
//	private ReconstructionViewer viewer;
//
//	public void mysetup(ReconstructionViewer viewer)
//	{
//		this.viewer=viewer;
//	}
//
//	public void run()
//	{
//		this.viewer.update();
//	}
//}
//
///** Threaded call to the viewer.updateShort method - used to update the reconstruction
// * viewer in order to show the particles detected between the given frame range.
// */
//class ViewerUpdateShortTest extends Thread
//{
//	private ReconstructionViewer viewer;
//	private int start;
//	private int stop;
//
//	public void mysetup(ReconstructionViewer viewer, int start, int stop)
//	{
//		this.viewer=viewer;
//		this.start=start;
//		this.stop=stop;
//	}
//
//	public void run()
//	{
//		this.viewer.updateShort(this.start, this.stop);
//	}
//}
